package cn.tedu.charging.order.quartz;

import cn.tedu.charging.common.utils.GetAllBeanUtil;
import cn.tedu.charging.order.dao.repository.OrderRepository;
import cn.tedu.charging.order.pojo.po.ChargingBillFailPo;
import cn.tedu.charging.order.pojo.po.ChargingBillSuccessPo;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;
import java.util.UUID;


@Slf4j
public class DeviceCheckJob implements Job {

    public DeviceCheckJob() {
    }

    public DeviceCheckJob(String orderNo, Integer gunId) throws SchedulerException {
        log.debug("添加设备自检定时任务:订单号:{},枪id:{}",orderNo,gunId);

        //创建调度器工厂
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        //通过调度器工厂创建调度器
        Scheduler scheduler = schedulerFactory.getScheduler();

        JobDetail jobDetail = JobBuilder.newJob(DeviceCheckJob.class)
                //定义定时任务的名称和组
                .withIdentity("DeviceCheckJob" + UUID.randomUUID(),"device_check_jobs")
                //传入订单号
                .usingJobData("orderNo",orderNo)
                //传入枪id
                .usingJobData("gunId",gunId)
                .build();

        //定义任务触发的时间
        //当前时间 + 1分钟 (模拟设备自检需要1分钟)
        //当前时间
        long now = System.currentTimeMillis();
        // 1分钟
        long deviceCheckTime =  1 * 30 * 1000;
        //任务触发时间  当前时间 + 1分钟  任务会在1分钟以后执行
        Date triggerTime = new Date(now + deviceCheckTime);

        //触发器
        Trigger trigger = TriggerBuilder.newTrigger().startAt(triggerTime).build();

        //调度器scheduler  把 任务 jobDetail 和  触发器 trigger 进行绑定
        //调度器 scheduler 让任务 jobDetail 按照 时间 trigger 来触发
        scheduler.scheduleJob(jobDetail,trigger);
        //启动调用器
        scheduler.start();

    }


    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.debug("倒计时已结束 开始检查 设备是否响应成功");
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String orderNo = jobDataMap.getString("orderNo");
        Integer gunId = jobDataMap.getInt("gunId");
        log.debug("订单号:{},枪id:{}",orderNo,gunId);

        OrderRepository orderRepository = GetAllBeanUtil.getBean("orderRepository", OrderRepository.class);

        ChargingBillSuccessPo chargingBillSuccessPo =  orderRepository.getSuccessOrderByOrder(orderNo);

        if (chargingBillSuccessPo==null){
            ChargingBillFailPo chargingBillFailPo =  orderRepository.getFailOrderByOrder(orderNo);
            if (chargingBillFailPo==null){
                log.debug("设备无响应！开始一系列操作！");
                log.debug("1.枪ID 设置为 故障");
                log.debug("2.通知用户 更换设备");
                log.debug("3.通知维修人员 维修设备");
                log.debug("4.生成维修单");
            }else {
                log.debug("设备响应成功！ 已经插入失败订单！20");
            }
        }else {
            log.debug("设备响应成功！ 已经插入成功订单！10");
        }

    }
}
